import { Injectable } from '@angular/core';
import { KehuDto } from '../../kehus/models';
import { saveAs } from 'file-saver';
import * as ExcelJS from 'exceljs';

@Injectable({
  providedIn: 'root'
})
export class ExcelExportService {

  constructor() { }

  /**
   * 导出客户数据到Excel
   * @param data 客户数据数组
   * @param fileName 文件名
   */
  async exportKehuToExcel(data: KehuDto[], fileName: string = 'clients'): Promise<void> {
    if (!data || data.length === 0) {
      throw new Error('没有数据可导出');
    }
    
    try {
      console.log('======开始导出Excel======');
      console.log('数据量:', data.length);
      
      // 创建工作簿和工作表
      const workbook = new ExcelJS.Workbook();
      const worksheet = workbook.addWorksheet('客户列表');
      
      // 添加表头
      worksheet.addRow([
        '序号', '客户名称', '联系人', '电话', '手机', '地址',
        '企业属性', '合同编号', '备用联系人', '备用电话',
        '电子邮箱', '备注'
      ]);
      
      // 设置列宽
      worksheet.columns = [
        { width: 6 },  // 序号
        { width: 20 }, // 客户名称
        { width: 15 }, // 联系人
        { width: 15 }, // 电话
        { width: 15 }, // 手机
        { width: 30 }, // 地址
        { width: 15 }, // 企业属性
        { width: 15 }, // 合同编号
        { width: 15 }, // 备用联系人
        { width: 15 }, // 备用电话
        { width: 20 }, // 电子邮箱
        { width: 30 }  // 备注
      ];
      
      // 添加数据行
      for (let i = 0; i < data.length; i++) {
        const item = data[i];
        worksheet.addRow([
          i + 1,
          item.name || '',
          item.contactPerson || '',
          item.phone || '',
          item.mobile || '',
          item.address || '',
          item.enterpriseAttribute || '',
          item.contractNumber || '',
          item.contact1 || '',
          item.phone1 || '',
          item.emailAddress || '',
          item.remarks || ''
        ]);
      }
      
      // 加粗表头
      worksheet.getRow(1).font = { bold: true };
      
      console.log('Excel数据已添加完成，准备导出...');
      
      // 生成文件名
      const fullFileName = `${fileName}_${this.formatDate(new Date())}.xlsx`;
      
      try {
        // 导出文件 - 使用两种方法尝试保存
        const buffer = await workbook.xlsx.writeBuffer();
        console.log('Excel缓冲区已创建, 大小:', buffer.byteLength);
        
        try {
          // 方法1：使用file-saver库保存
          const blob = new Blob([buffer], { 
            type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
          });
          saveAs(blob, fullFileName);
          console.log('使用file-saver导出成功');
        } catch (saveError) {
          console.warn('使用file-saver保存失败，尝试使用原生下载方式', saveError);
          
          // 方法2：使用原生方式保存
          const blob = new Blob([buffer], { 
            type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
          });
          
          const url = window.URL.createObjectURL(blob);
          const link = document.createElement('a');
          link.href = url;
          link.download = fullFileName;
          document.body.appendChild(link);
          link.click();
          
          // 清理资源
          setTimeout(() => {
            document.body.removeChild(link);
            window.URL.revokeObjectURL(url);
          }, 100);
        }
        
        console.log('======Excel导出完成======');
      } catch (error) {
        console.error('生成Excel文件失败:', error);
        throw new Error('生成Excel文件失败: ' + (error?.message || '未知错误'));
      }
    } catch (error) {
      console.error('导出Excel过程中发生错误:', error);
      throw error;
    }
  }
  
  /**
   * 批量导出功能，用于处理大量数据
   * @param fetchFunction 获取数据的函数，返回Promise<KehuDto[]>
   * @param fileName 文件名
   * @param progressCallback 进度回调函数
   */
  async batchExportToExcel(
    fetchFunction: () => Promise<KehuDto[]>,
    fileName: string = 'clients_all',
    progressCallback?: (progress: number) => void
  ): Promise<void> {
    try {
      console.log('======开始批量导出======');
      
      // 显示进度回调
      if (progressCallback) {
        progressCallback(10);
      }
      
      // 获取全部数据
      console.log('开始获取数据...');
      const allData = await fetchFunction();
      console.log('数据获取完成，总数:', allData?.length || 0);
      
      if (!allData || allData.length === 0) {
        throw new Error('没有获取到有效数据');
      }
      
      if (progressCallback) {
        progressCallback(50);
      }
      
      // 导出数据
      await this.exportKehuToExcel(allData, fileName);
      
      if (progressCallback) {
        progressCallback(100);
      }
      
      console.log('======批量导出完成======');
    } catch (error) {
      console.error('批量导出失败:', error);
      throw error;
    }
  }

  /**
   * 格式化日期为YYYYMMDD格式
   * @param date 日期对象
   * @returns 格式化后的日期字符串
   */
  private formatDate(date: Date): string {
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    return `${year}${month}${day}`;
  }
} 